package util

import (
	"bufio"
	"fmt"
	"io"
	"io/ioutil"
	"log"
	"os"
	"path/filepath"
	"strings"
)

func GenerateFile(fileName string, str string) {
	if !FileExist(fileName) {
		WriteFileCustom(fileName, str, "")
	}

}

//获取当前运行文件目录
func GetExecutePath() string {
	dir, err := filepath.Abs(filepath.Dir(os.Args[0]))
	if err != nil {
		panic(err)
	}
	return dir
}

// 判断所给路径文件/文件夹是否存在

func FileExist(fileName string) bool {
	if _, err := os.Stat(fileName); err != nil {
		if os.IsNotExist(err) {
			//文件不存
			return false
		} else {
			panic(err)
		}
	}
	return true
}
func ReadFileString(fileName string) (contents string) {
	f, err := ioutil.ReadFile(fileName)
	if err != nil {
		panic(err)
	}

	return string(f)
}
func ReadFile(fileName string) (contents []string) {
	if fileName == "" {
		return
	}
	if _, err := os.Stat(fileName); err != nil {
		if os.IsNotExist(err) {
			//文件不存
			fmt.Println("File not exist")
			return
		} else {
			panic(err)
		}
	}

	file, err := os.OpenFile(fileName, os.O_RDONLY, os.ModePerm)
	if err != nil {
		panic(err)
	}
	defer func() {
		if err = file.Close(); err != nil {
			panic(err)
		}
	}()
	buf := bufio.NewReader(file)
	for {
		line, err := buf.ReadString('\n')
		line = strings.TrimSpace(line)
		if err != nil {
			if err == io.EOF {
				//fmt.Println(fileName, "read end!")
				break
			} else {
				panic(err)
			}
		} else {
			contents = append(contents, line)
		}
	}
	return
}

func WriteFileCustom(filename string, msg string, optype string) {
	var f *os.File
	var err error
	_, err = os.Stat(filename)
	if os.IsNotExist(err) {
		//文件不存在创建
		if f, err = os.Create(filename); err != nil {
			panic(err)
		}
	} else {
		fileMode := os.O_RDWR | os.O_CREATE
		if optype == "append" {
			fileMode = fileMode | os.O_APPEND
			msg = msg + "\n"
		} else {
			fileMode = fileMode | os.O_TRUNC

		}
		if f, err = os.OpenFile(filename, fileMode, os.ModePerm); err != nil {
			panic(err)
		}
	}

	defer func() {
		if err = f.Close(); err != nil {
			fmt.Println(err)
		}
	}()

	if _, err = f.Write([]byte(msg)); err != nil {
		fmt.Println(err.Error())
	}

}

func WriteFile(filename string, msg string) {
	var f *os.File
	var err error

	_, err = os.Stat(filename)
	if os.IsNotExist(err) {
		//文件不存在创建
		if f, err = os.Create(filename); err != nil {
			panic(err)
		}
	} else {
		f, err = os.OpenFile(filename, os.O_APPEND|os.O_WRONLY, os.ModeAppend)
	}

	if err != nil {
		log.Println(err.Error())
	}
	_, err = f.Write([]byte(msg))
	if err != nil {
		log.Println(err.Error())
	}
	defer f.Close()
}

//
//func ReadFile(fileName string) (contents []string, err error) {
//
//	if fileName == "" {
//		return
//	}
//	file, err := os.OpenFile(fileName, os.O_RDWR, 0666)
//	if err != nil {
//		return
//	}
//	defer file.Close()
//	//stat, err := file.Stat()
//	if err != nil {
//		panic(err)
//	}
//	//var size = stat.Size()
//	buf := bufio.NewReader(file)
//	for {
//		line, err := buf.ReadString('\n')
//		line = strings.TrimSpace(line)
//		if err != nil {
//			if err == io.EOF {
//				fmt.Println(fileName, " file read ok!")
//				break
//			}
//		} else {
//			contents = append(contents, line)
//		}
//
//	}
//
//	return
//}

//逐行读取
func ReadLine(filename string, chanr chan string) {
	f, err := os.Open(filename)

	if err != nil {
		panic(err)
	}
	defer f.Close()
	r := bufio.NewReader(f)
	for {
		con, err := readLine(r)
		if err != nil {
			close(chanr)
			break
		} else {
			chanr <- con
		}
	}

}

func readLine(r *bufio.Reader) (string, error) {
	line, isprefix, err := r.ReadLine()
	for isprefix && err == nil {
		var bs []byte
		bs, isprefix, err = r.ReadLine()
		line = append(line, bs...)
	}
	return string(line), err
}
